package com.bailiny.basicUtils;

import com.google.common.base.Optional;
import org.junit.Test;

import java.util.Set;

/**
 * Optional类其实是用一种具象的方式来避免开发者忘记判空，具体来说就是，Optional是一种傻瓜式的方式，
 * 因为Null自身的可读性是很差的，所以利用Optional包裹操作对象，强行用可读文字来提醒开发者需要考虑操作对象为空的可能性，
 * 例如if(optional.isPresent())相对于if (xxx==null)，可读性就强了很多
 */
public class OptionalDemo {

    @Test
    public void test() {
        Optional<Integer> possible = Optional.of(5); // 创建指定引用的Optional实例，若引用为null则快速失败
        Optional<Object> absent = Optional.absent(); // 创建引用缺失的Optional实例
        Optional<Integer> integerOptional = Optional.fromNullable(1);// 创建指定引用的Optional实例，若引用为null则表示缺失

        possible.isPresent(); // 如果Optional包含非null的引用（引用存在），返回true
        possible.get(); // 返回Optional所包含的引用，若引用缺失，则抛出java.lang.IllegalStateException
        possible.or(3); // 返回Optional所包含的引用，若引用缺失，返回指定的值
        possible.orNull(); // 返回Optional所包含的引用，若引用缺失，返回null
        // 返回Optional所包含引用的单例不可变集，如果引用存在，返回一个只有单一元素的集合，如果引用缺失，返回一个空集合。
        Set<Integer> set = possible.asSet();
    }
}
